package com.study.file.demo;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;

import org.junit.Test;

/**
* @Name: FileDemo01
* @Description: File类测试类
* 说明：
* 	Java提供了一个File类，来供我们操作硬盘上的文件或目录。
* 	File：文件和目录（文件夹）路径名的抽象表示形式。
* 	构造方法：
* 		File(String pathname)  根据路径名字符串来得到File对象；
* 		File(String parent, String child)  根据一个目录和一个子文件/目录名字符串得到File对象；
* 		File(File parent, String child)  根据一个父File对象和一个子文件/目录名字符串得到File对象；
* 	创建功能：
* 		public boolean createNewFile() throws IOException	创建文件，返回true；如果存在，则不创建，返回false；如果父目录不存在，则不创建，将抛出IOException异常；
* 		注意：如果创建的文件或目录没有指定盘符路径，默认在项目路径下进行创建。
* 		public boolean mkdir() 创建目录，返回true；如果存在，则不创建，返回false；如果父目录不存在，则不创建，返回false；
* 		public boolean mkdirs() 创建目录，如果父目录夹不存在，则先创建父目录，再创建子目录，返回true；如果存在，则不创建，返回false；
* 	删除功能：
* 		public boolean delete() 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录，则该目录必须为空才能删除。 
* 		注意：java中文件/目录的删除不走回收站。
* 	重命名功能：
* 		public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
* 		注意：如果路径名相同，为重命名；如果路径名不同，为重命名并剪切。
* 	判断功能：
* 		public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 
* 		public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。由 Java 应用程序创建的所有非目录文件一定是标准文件。
* 		public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 
* 		public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。
* 		public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 
* 		public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 
* 		public boolean canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 
* 	获取功能：
* 		public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 
* 		public String getPath() 返回此抽象路径名的相对路径名字符串。 
* 		public String getName() 返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空，则返回空字符串。 
* 		public long length() 返回由此抽象路径名表示的文件的长度。此抽象路径名表示的文件的长度，以字节为单位；如果文件不存在，则返回 0L。
* 		public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 
* 			表示文件最后一次被修改的时间的 long 值，用与时间点（1970 年 1 月 1 日，00:00:00 GMT）之间的毫秒数表示；如果该文件不存在，或者发生 I/O 错误，则返回 0L 
* 	高级获取功能：
* 		public String[] list() 获取指定目录下的所有文件或者目录的名称数组
* 		public String[] list(FilenameFilter filter) 
* 						返回一个字符串数组，这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
* 						除了返回数组中的字符串必须满足过滤器外，此方法的行为与 list() 方法相同。
* 						参数：filter - 文件名过滤器 
* 		public File[] listFiles() 获取指定目录下的所有文件或者目录的File数组
* 		public File[] listFiles(FilenameFilter filter) 返回抽象路径名数组，这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-14 下午8:49:00 
* @Version: V1.0
 */
public class FileDemo01 {
	
	/**
	* @Name: fileConstructorTest
	* @Description: File对象的三种实例化方式
* * 	构造方法：
* 		File(String pathname)  根据路径名字符串来得到File对象；
* 		File(String parent, String child)  根据一个目录和一个子文件/目录名字符串得到File对象；
* 		File(File parent, String child)  根据一个父File对象和一个子文件/目录名字符串得到File对象；
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午9:01:28
	* @Parameters: 
	* @Return: void
	*/
	@Test
	public void fileConstructorTest() throws IOException {
		File f1 = new File("D:\\tools\\file.txt") ;
		System.out.println(f1.getAbsolutePath());
		File f2 = new File("D:\\tools", "file.txt") ;
		System.out.println(f2.getCanonicalPath());
		File f3 = new File("D:\\tools") ;
		System.out.println(f3.getName());
		File f4 = new File(f3, "file.txt") ;
		System.out.println(f4.getPath());
	}
	
	/**
	* @Name: createFileAndDirTest
	* @Description: 创建文件/目录测试方法
* * 	创建功能：
* 		public boolean createNewFile() throws IOException	创建文件，返回true；如果存在，则不创建，返回false；如果父目录不存在，则不创建，将抛出IOException异常；
* 		注意：如果创建的文件或目录没有指定盘符路径，默认在项目路径下进行创建。
* 		public boolean mkdir() 创建目录，返回true；如果存在，则不创建，返回false；如果父目录不存在，则不创建，返回false；
* 		public boolean mkdirs() 创建目录，如果父目录夹不存在，则先创建父目录，再创建子目录，返回true；如果存在，则不创建，返回false；
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午9:26:12
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void createFileAndDirTest() throws IOException {
		//1、在D盘目录下创建demo目录
		//File f1 = new File("D:\\demo") ;
		//System.out.println("创建demo目录：" + f1.mkdir());
		//2、在demo目录下创建test.txt文件
		//File f2 = new File("D:\\demo\\test.txt") ;
		//System.out.println("创建test.txt：" + f2.createNewFile());
		//3、在D盘目录test下创建aaa.txt文件
		//出现异常，创建失败：java.io.IOException: 系统找不到指定的路径。即不存在test目录
		//File f3 = new File("D:\\test\\aaa.txt") ;
		//System.out.println("在D盘目录test下创建aaa.txt文件:" + f3.createNewFile());
		//4、在D盘目录test下创建aaa目录
		//创建失败，返回false，原因：不存在test目录
		//File f4 = new File("D:\\test\\aaa") ;
		//System.out.println("在D盘目录test下创建aaa目录：" + f4.mkdir());
		//5、在D盘目录test下创建aaa目录
		File f5 = new File("D:\\test\\aaa") ;
		System.out.println("在D盘目录test下创建aaa目录：" + f5.mkdirs());
	}
	
	/**
	* @Name: deleteFileAndDirTest
	* @Description: 删除文件/目录测试方法
* * 	删除功能：
* 		public boolean delete() 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录，则该目录必须为空才能删除。 
* 		注意：java中文件/目录的删除不走回收站。
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午9:34:46
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void deleteFileAndDirTest() {
		//获取待删除文件/目录的抽象路径名表示的File对象
		File f1 = new File("D:\\demo\\test.txt") ;
		//删除D:\\demo\\test.txt文件
		System.out.println("删除D:\\demo\\test.txt文件:" + f1.delete());
		//删除D:\\demo目录
		File f2 = new File("D:\\demo") ;
		System.out.println("删除D:\\demo目录:" + f2.delete());
		//删除D:\\test
		//删除失败：目录D:\\test下存在子目录/文件
		File f3 = new File("D:\\test") ;
		System.out.println("删除D:\\test:" + f3.delete());
		//删除D:\\test\\aaa
		File f4 = new File("D:\\test\\aaa") ;
		System.out.println("删除D:\\test\\aaa:" + f4.delete());
		//删除D:\\test
		File f5 = new File("D:\\test") ;
		System.out.println("删除D:\\test:" + f4.delete());
	}
	
	/**
	* @Name: renameFileTest
	* @Description: 文件重命名测试方法
* * 	重命名功能：
* 		public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
* 		注意：如果路径名相同，为重命名；如果路径名不同，为重命名并剪切。
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午9:58:08
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void renameFileTest() {
		//获取File对象
		//File f1 = new File("HelloWorld.png") ;
		//File newFile = new File("hello.png") ;
		//System.out.println("将HelloWorld.png名称修改为hello.png：" + f1.renameTo(newFile));
		//获取File对象
		File f2 = new File("hello.png") ;
		File newFile2 = new File("D:\\copy.png") ;
		System.out.println("将hello.png剪切到D:\\copy.png:" + f2.renameTo(newFile2));
	}
	
	/**
	* @Name: judgeFileTest
	* @Description: File类的判断方法测试
* * 	判断功能：
* 		public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 
* 		public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。由 Java 应用程序创建的所有非目录文件一定是标准文件。
* 		public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 
* 		public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。
* 		public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 
* 		public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 
* 		public boolean canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午10:09:23
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void judgeFileTest() {
		//获取File对象
		File file = new File("HelloWorld.png") ;
		System.out.println("exists:" + file.exists());
		System.out.println("isDirectory:" + file.isDirectory());
		System.out.println("isFile:" + file.isFile());
		System.out.println("isAbsolute:" + file.isAbsolute());
		System.out.println("canRead:" + file.canRead());
		System.out.println("canWrite:" + file.canWrite());
		System.out.println("canExecute:" + file.canExecute());
	}
	
	/**
	* @Name: getFileInfoTest
	* @Description: 获取文件基本信息测试类
* * 	获取功能：
* 		public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 
* 		public String getPath() 返回此抽象路径名的相对路径名字符串。 
* 		public String getName() 返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空，则返回空字符串。 
* 		public long length() 返回由此抽象路径名表示的文件的长度。此抽象路径名表示的文件的长度，以字节为单位；如果文件不存在，则返回 0L。
* 		public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 
* 			表示文件最后一次被修改的时间的 long 值，用与时间点（1970 年 1 月 1 日，00:00:00 GMT）之间的毫秒数表示；如果该文件不存在，或者发生 I/O 错误，则返回 0L 
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午10:19:35
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void getFileInfoTest() {
		//获取File对象
		File file = new File("HelloWorld.png") ;
		System.out.println("getAbsolutePath:" + file.getAbsolutePath());
		System.out.println("getPath:" + file.getPath());
		System.out.println("getName:" + file.getName());
		System.out.println("length(byte):" + file.length());
		System.out.println("length(Mbyte):" + file.length()/1024);
		System.out.println("lastModified:" + file.lastModified());
		long lastModified = file.lastModified() ;
		Date date = new Date(lastModified) ;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
		String format = sdf.format(date) ;
		System.out.println("lastModified:" + format) ;
	}
	
	/**
	* @Name: superGetFileInfoTest
	* @Description: 文件高级获取功能方法测试
* * 	高级获取功能：
* 		public String[] list() 获取指定目录下的所有文件或者目录的名称数组
* 		public File[] listFiles() 获取指定目录下的所有文件或者目录的File数组
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午10:31:13
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void superGetFileInfoTest() {
		//获取File对象
		File file = new File("e:\\") ;
		//获取e盘符目录下的所有文件和目录名称的字符串表示
		String[] list = file.list() ;
		for (String name : list) {
			System.out.println(name);
		}
		System.out.println("=======================");
		//获取e盘符目录下的所有文件和目录的File对象
		File[] listFiles = file.listFiles() ;
		for (File file2 : listFiles) {
			System.out.println(file2.getName());
		}
	}
	
	/**
	* @Name: findJpgFileByDirName
	* @Description: 文件高级获取功能方法测试（使用文件名过滤器），输出指定目录下所有以jpg结尾的文件名称
* * 		public String[] list(FilenameFilter filter) 
* 				返回一个字符串数组，这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
* * 		public File[] listFiles(FilenameFilter filter)
* 				返回抽象路径名数组，这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 上午9:25:48
	* @Parameters: 
	* @Return: void
	 */
	public void findJpgFileByDirName() {
		File file = new File("d:\\") ;
		//使用文件名称过滤器，获取指定目录下所有以'.jpg'结尾的文件名称
		String[] fileNameList = file.list(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				boolean flag = false ;
				File f = new File(dir, name) ;
				if(f.isFile() && name.endsWith(".jpg"))
					flag = true ;
				return flag ;
			}
		}) ;
		for (String fileName : fileNameList) {
			System.out.println(fileName);
		}
	}
	

}
